Формирование ключа заголовка, соль и количество итераций
Ключ заголовка используется для шифрования и дешифрования зашифрованной области заголовка тома
VeraCrypt (в случае
шифрования системы – области ключевых данных), которая содержит мастер-ключ и другую информацию (см. разделы
Схема шифрования и
Спецификация формата томов VeraCrypt). В томах, созданных с помощью VeraCrypt (и для
шифрования системы), эта область зашифрована в режиме XTS (см. раздел
Режимы работы). Для шифрования системы VeraCrypt использует PBKDF2-HMAC. Для несистемных томов и файловых контейнеров VeraCrypt поддерживает две функции формирования ключей заголовка: PBKDF2,
определённую в PKCS #5 v2.0; см.
[7], и Argon2id.
Формирование ключа PBKDF2-HMAC
Метод PBKDF2 использует псевдослучайные функции на основе HMAC со следующими доступными алгоритмами хеширования: HMAC-SHA-512, HMAC-SHA-256, HMAC-BLAKE2S-256, HMAC-Whirlpool или HMAC-Streebog (см. [8, 9, 20, 22]) –
какая из них будет применяться, выбирается пользователем. Длина сформированного ключа не зависит от
размера вывода лежащей в основе хеш-функции. Например, длина ключа заголовка для шифра AES-256 всегда равна
256 битам, даже если используется HMAC-SHA-512 (в режиме XTS применяется дополнительный 256-битовый
вторичный ключ заголовка; следовательно, для AES-256 в целом применяются два 256-битовых ключа). Более
подробную информацию см. в [7]. Для формирования ключа заголовка выполняется большое количество итераций,
что увеличивает время, необходимое для полного поиска паролей (то есть атакой методом перебора) [7].
Формирование ключа Argon2id
Argon2id — это функция формирования ключа с повышенными требованиями к памяти, обеспечивающая устойчивость к атакам с компромиссом время-память и атакам по сторонним каналам. В отличие от PBKDF2-HMAC, Argon2id не использует отдельный выбор алгоритма хеширования, а применяет собственную внутреннюю хеш-функцию (
BLAKE2b-512). Для Argon2id требуются три параметра: затраты памяти (объём используемой памяти), затраты времени (число итераций) и параллелизм (число потоков). VeraCrypt во всех случаях устанавливает параметр параллелизма равным 1.
Для обеих функций формирования ключа применяется 512-битовая соль, что означает 2
512
ключей для каждого пароля. Благодаря этому значительно повышается устойчивость к атакам с офлайн-словарями/"радужной
таблицей" (соль крайне осложняет предвычисление всех ключей для словаря паролей) [7]. Соль состоит из
случайных значений, созданных
генератором случайных чисел VeraCrypt в процессе создания тома.
До версии 1.12 VeraCrypt всегда использовал PBKDF2-HMAC с фиксированным количеством итераций, зависящим только от типа
тома и используемого алгоритма хеширования.
Начиная с версии 1.12, поле
PIM (Персональный множитель итераций)
даёт пользователям больший контроль над вычислительными параметрами, используемыми функцией формирования ключа.
Параметры PBKDF2-HMAC
Если
PIM не указан или равен нулю, VeraCrypt использует следующие стандартные значения для PBKDF2-HMAC:
- Для шифрования системы (шифрование загрузки), если используется SHA-256, BLAKE2s-256 или Streebog, число итераций = 200 000.
- Для шифрования системы, если используется SHA-512 или Whirlpool, а также для несистемных разделов и файловых контейнеров с PBKDF2-HMAC число итераций = 500 000.
Если
PIM указан, то количество итераций функции формирования ключа PBKDF2 вычисляется следующим образом:
- Для шифрования системы, если не используется SHA-512 или Whirlpool, число итераций = PIM × 2048.
- Для шифрования системы, если используется SHA-512 или Whirlpool, а также для несистемных разделов и файлов-контейнеров с PBKDF2-HMAC число итераций = 15 000 + (PIM × 1000).
Параметры Argon2id
Для Argon2id значение PIM управляет затратами памяти и времени. Если PIM не указан, используются параметры по умолчанию, соответствующие PIM = 12 (416 MiB памяти, 6 итераций).
Для Argon2id VeraCrypt формирует фиксированные 192 байта ключевого материала заголовка для текущего формата томов независимо от выбранного алгоритма шифрования. Затем выбранный алгоритм шифрования использует требуемый префикс этого вывода. Например, AES-XTS использует первые 64 байта. Реализации должны запрашивать у Argon2id 192 байта, а затем выбирать требуемый префикс; запрос только длины ключевого материала выбранного алгоритма даёт другой вывод Argon2id, поскольку Argon2id включает запрошенную длину вывода в своё вычисление.
Ключи заголовка, используемые шифрами при каскадном (последовательном) шифровании, не зависят друг от друга,
хотя они и сформированы из одного пароля (к которому могут быть применены ключевые файлы). Например, для
каскада AES-Twofish-Serpent функция формирования ключа заголовка получает 768-битный ключ шифрования из
заданного пароля (и, для режима XTS, вдобавок 768-битовый вторичный ключ
заголовка из заданного пароля). Сгенерированный 768-битовый ключ заголовка затем разделяется на три 256-битовых
ключа (для режима XTS вторичный ключ разделяется тоже на три 256-битовых ключа,
поэтому в действительности каскад в целом использует шесть 256-битовых ключей), из которых первый ключ
используется шифром Serpent, второй – шифром Twofish, а третьй – шифром AES (кроме того, для режима XTS
первый вторичный ключ используется шифром Serpent, второй вторичный ключ – шифром Twofish, и третий вторичный
ключ – шифром AES). Отсюда следует, что даже если у неприятеля окажется один из ключей, он не сможет им
воспользоваться для формирования остальных, поскольку не существует реально осуществимого способа определить
пароль по полученному из него в результате формирования ключу (за исключением атаки полным перебором при
слабом пароле).